public class Rectangle {
    private int x;
    private int y;
    private int width;
    private int height;
    //对应原题的要求“有四个数据成员，x、y表示……”。
    public Rectangle(int x,int y,int width,int height){
        this.x=x;
        this.y=y;
        this.width=width;
        this.height=height;
    }
    //对应原题要求的构造方法。
    public Rectangle(){
        this.x=0;
        this.y=0;
        this.width=0;
        this.height=0;
    }
    //默认构造函数，旨在提高严谨性，实际上不写这个功能也能正确的。
    public int getX() {
        return this.x;
    }
    public int getY() {
        return this.y;
    }
    public int getWidth() {
        return this.width;
    }
    public int getHeight() {
        return this.height;
    }
    //以上四个对应原题要求的四个“get”方法。

    @Override
    public String toString() {
        return "{("+x+","+y+"),"+width+"*"+height+")}";
    }
    //重写toString方法并按照规定格式输出{(x,y),width*height}。
    public void union(Rectangle rectangle){
        this.width=max(this.x+this.width,rectangle.x+ rectangle.width)-min(this.x, rectangle.x);//两个矩形组合在一起，组成重叠图形，用这个来算width和x，下方同理
        this.height=max(this.y+this.height, rectangle.y+ rectangle.height)-min(this.y, rectangle.y);
        this.x=min(this.x, rectangle.x);
        this.y=min(this.y, rectangle.y);
    }
    //union方法。原题要求是在调用该方法的Rectangle对象上直接修改它的数据成员。因此，我们可以先确定width和height，再修改x和y。（*）
    public int max(int num1,int num2){
        if(num1>num2){
            return num1;
        }
        else {
            return num2;
        }
    }
    //服务于union方法，避免代码复制
    public int min(int num1,int num2){
        if(num1<num2){
            return num1;
        }
        else {
            return num2;
        }
    }
    //服务于union方法，避免代码复制
}
//
//其实源代码的好多“this”可以删掉。这里因为个人代码习惯，不改了。
//
//（*）号注释：
//①为什么要先修改width和height？
//我们的核心思路是通过x,y,width和height计算出一个矩形的信息，使该矩形为最小的、能包裹住this和rectangle的矩形。
//通过源代码我们可以知道，width和height是依赖x和y才能算出来，如果先把这俩改了，那width和height就没法算了
//②union()代码可不可以优化？
//可以。首先，max()和min()实际上可以直接用Java自带的Math.max()和Math.min()。只不过我当时没想到……
//第二个可以优化的点是，可以对传进方法的rectangle形参进行检测。检测其是否指向Null。
//不过源代码的功能已经是正确的了。